package com.utcs.common.persistence;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.utcs.modules.resource.basic.entity.User;
import com.utcs.modules.resource.basic.utils.UserUtils;

import javax.xml.bind.annotation.XmlTransient;
import java.io.Serializable;

/**
 * Created by Fly on 2017/5/23.
 */
public abstract class BaseEntity<T>  implements Serializable{

    private static final long serialVersionUID = 1L;

    /**
     * 当前用户
     */
    protected User currentUser;
    /**
     * 是否是新记录（默认：false），调用setIsNewRecord()设置新记录，使用自定义ID。
     * 设置为true后强制执行插入语句，ID不会自动生成，需从手动传入。
     */
    protected boolean newRecord = false;
    /**
     * id 唯一主键 自增
     */
    protected Integer id;

    /**
     * 当前实体分页对象
     */
    protected Page<T> page;


    public BaseEntity() {
    }

    public BaseEntity(Integer id) {
        this.id = id;
    }

    public User getCurrentUser() {
        if(currentUser == null){
            currentUser = UserUtils.getUser();
        }
        return currentUser;
    }

    public void setCurrentUser(User currentUser) {
        this.currentUser = currentUser;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * 插入之前执行方法，子类实现
     */
    public abstract void preInsert();

    /**
     * 更新之前执行方法，子类实现
     */
    public abstract void preUpdate();

    @JsonIgnore
    @XmlTransient
    public Page<T> getPage() {
        if (page == null){
            page = new Page<T>();
        }
        return page;
    }

    public Page<T> setPage(Page<T> page) {
        this.page = page;
        return page;
    }

    /**
     * 是否是新记录（默认：false），调用setIsNewRecord()设置新记录，使用自定义ID。
     * 设置为true后强制执行插入语句，ID不会自动生成，需从手动传入。
     * @return
     */
    public boolean isNewRecord() {
        System.out.println("newRecord:" + newRecord);
        System.out.println("getId():" + getId());
        return newRecord || getId() == null;
    }

    public void setNewRecord(boolean newRecord) {
        this.newRecord = newRecord;
    }
}
